//File : listD.h
//Generic Class untuk container List of Bidang* pada class Latar

#ifndef listD_h
#define listD_h


#include <iostream>
using namespace std;
template <class list_type>
class ListD{
	public:
	
	/* Empat Sekawan */
	ListD() 
	/* Constructor Class ListD */
	/* I.S. ListD belum terbentuk */
	/* F.S. ListD terbentuk */
	{
		ListSize=0;
		topList =0;
		BS = new list_type [ListSize];
		cout << "ctor ListD" << endl;
	}
	
	
	ListD(const ListD& LS) 
	/* CCtor Class ListD */
	/* I.S. ListD belum terbentuk */
	/* F.S. ListD terbentuk sama dengan LS input */
	{
		BS = new list_type [LS.size()];
		ListSize = LS.size();
		topList = 0;
		for (int i=0; i<ListSize; i++) {
			BS[i] = LS.BS[i];
			topList++;
		}
	}
	
	
	~ListD() 
	/* Destructor Class ListD */
	/* I.S. ListD terdefinisi */
	/* F.S. ListD dimusnahkan */
	{
		cout << "dtor List" << endl;
		for (int z=0; z<ListSize; z++) {
			delete BS[z];
		}
		delete [] BS;
	}
	
	
	ListD& operator=(const ListD& LS) 
	/* Operator Assignment Class ListD */
	/* I.S. ListD terdefinisi */
	/* F.S. ListD sama dengan LS input */
	{
		if (BS) {
			delete [] BS;
		}
		BS = new list_type [LS.size()];
		ListSize = LS.size();
		topList = 0;
		for (int i=0; i<ListSize; i++) {
			BS[i] = LS.BS[i];
			topList++;
		}
	}

    /* Method Lain */
	
	list_type operator[](int z) const 
	/* Mengembalikan sebuah list_type berindeks z */
	{
		return BS[z];
	}

    void push_back(list_type item) 
	/* Memasukkan sebuah list_type ke dalam ListD */
	/* I.S. ListD terdefinisi */
	/* F.S. item dimasukkan ke dalam ListD */
	{
		ListD<list_type> LTemp (*this);
		if (BS) {
			delete [] BS;
		}
		ListSize = LTemp.size() + 1;
		topList = 0;
		BS = new list_type [LTemp.size()];
		for (int i=0; i<LTemp.size(); i++) {
			BS[i] = LTemp.BS[i];
			topList++;
		}
        BS [topList] = item;
        topList++;
	}
	
	
    void pop(list_type& item) 
	/* Mengeluarkan sebuah list_type ke dalam ListD */
	/* I.S. ListD terdefinisi */
	/* F.S. item berisi elemen terakhir ListD */
	{
		item = BS[topList];
        topList--;
	}
	
	
	int size() const 
	/* Mengembalikan ListSize dari ListD */
	{
		return ListSize;
	}

	protected:
	//data member
	list_type *BS; // array of list_type
	int ListSize;
	int topList;
};
#endif
